#ifndef __TABLERO_H_INCLUDED__
#define __TABLERO_H_INCLUDED__

#include <string.h>
#include <iostream>

#define ANCHO_TABLERO 10
#define ALTO_TABLERO  10
#define MAX_BARCOS    10

#define ERROR_LIMITES           -1
#define ERROR_CASILLERO_OCUPADO -2
#define ERROR_CASILLERO_ILEGAL  -3
#define ERROR_CANTIDAD_EXCEDIDA -4

#define AGUA          0 
#define BARCO         1
#define BARCO_HUNDIDO 2
#define DISPARO       3

class Tablero{
private:
	char casilleros[ANCHO_TABLERO][ALTO_TABLERO];
public:

	bool comprobarLimites(int x, int y){
		return (x<ANCHO_TABLERO && y < ALTO_TABLERO);
	}

	Tablero(){
		for(int j=0;j<ALTO_TABLERO;j++)
			for(int i=0;i<ANCHO_TABLERO;i++)
				setCasillero(i, j, AGUA);
	}

	int recibirDisparo(int x, int y){
		if(!comprobarLimites(x,y))
			return ERROR_LIMITES;

		if(getCasillero(x,y) == BARCO){
			setCasillero(x, y, BARCO_HUNDIDO);
			return BARCO_HUNDIDO;
		}
		else{
			setCasillero(x, y, DISPARO);
			return DISPARO;
		}
		
		return 0;
	}

	int ubicarBarco(int x, int y){
		if(!comprobarLimites(x,y))
			return ERROR_LIMITES;

		if(getCasillero(x,y) == BARCO)
			return ERROR_CASILLERO_OCUPADO;

		for(int j=y-1;j<=y+1;j++)
			for(int i=x-1;i<=x+1;i++)
				if(comprobarLimites(i,j) && getCasillero(i,j) == BARCO)
					return ERROR_CASILLERO_ILEGAL;

		if(! (getCantidadBarcos() < MAX_BARCOS))
			return ERROR_CANTIDAD_EXCEDIDA;

		setCasillero(x, y, BARCO);

		return 0;
	}

	char getCasillero(int x, int y){
		if(!comprobarLimites(x,y))
			return AGUA;
		
		return casilleros[y][x];
	}

	int setCasillero(int x, int y, char casillero){
		if(!comprobarLimites(x,y))
			return ERROR_LIMITES;

		casilleros[y][x] = casillero;

		return 0;
	}

	int getCantidadBarcos(){
		int contador=0;

		for(int j=0;j<ALTO_TABLERO;j++)
			for(int i=0;i<ANCHO_TABLERO;i++)
				getCasillero(i,j)==BARCO?contador++:0;
		return contador;
	}

	int getAncho(){ return ANCHO_TABLERO; }
	int getAlto(){ return ALTO_TABLERO; }

	~Tablero(){};
};


#endif //__TABLERO_H_INCLUDED__
